package controllers;

import java.util.ArrayList;
import java.util.List;

import controllers.Secure.Security;

import models.Requerimento;
import models.Usuario;
import models.Voto;

import play.data.validation.Valid;
import play.mvc.Controller;
import play.mvc.With;

@Check("admin")
@With(Secure.class)
public class Coordenador extends Colegiado{


	/**
	 * 	INDEX'S DOS HTML'S 
	 */

	/**
	 * index da tela que exibe os requerimentos pendentes
	 * @param colegiado
	 */
	public static void index() {
		List<Requerimento> a = getPendentes();
		render(a);
	}

	/**
	 * index da tela que adiciona  um usuario
	 * @param usuario
	 */
	public static void indexUser(@Valid Usuario usuario){	
		render();		
	}

	/**
	 * index da tela para mostrar um requerimento
	 * @param req
	 */
	public static void indexConsultaRequerimento(@Valid Requerimento req, boolean votando, int id){

		String situacao;
			if(req.aprovado == 1)
			    situacao = "DEFERIDO";
			else
				situacao = "INDEFERIDO";
		
	
		render(req,votando,id,situacao);
	}

	/**
	 * index da tela para editar  um usuario
	 * @param usuario
	 */
	public static void indexUserEdit(@Valid Usuario usuario, long  id){	
		render(usuario,id);		
	}

	/**
	 * index da tela para mostrar os requerimento encerrados
	 * @param req
	 */
	public static void indexEncerrados(){
		List<Requerimento> enc = getEncerrados();
		List <String> aa = new ArrayList<String>();

		for(int i = 0; i < enc.size();i++){

			if(enc.get(i).aprovado == 1)
			    aa.add("DEFERIDO");
			else
				aa.add("INDEFERIDO");
		}

		render(enc,aa);
	}



	/**
	 * Mostra os membros do colegiado
	 */
	public static void verColegiado(){
		List<Usuario> colegiado = Usuario.getColegiado();
		render(colegiado);
	}

	/**
	 * 	FIM DOS INDEX'S DOS HTML'S 
	 */

	/**
	 * coordenador vota usando seu poder de decisao majoritário
	 * @param req requerimento ao qual se esta votando
	 * @param voto decisão do voto
	 */
	public static void votoMinerva(long id, boolean voto, boolean minerva){
		Requerimento req = Requerimento.findById(id);
		
		//cria um novo voto e o salva no sistema
		Voto votoNovo  = new Voto(voto, req, Usuario.getUsuarioPorEmail(Security.connected()), minerva);

		boolean ok = votoNovo.validateAndSave();
		
		//se ocorreu tudo certo no processo de salvar
		if(ok && minerva == true){
			req.encerrado = 1;
			if(voto == true)
			    req.aprovado = 1;
			else
				req.aprovado = 0;
			req.save();
			//deleta os votos
			Voto.deleteVotosRequeriento(req.id);
			informaFinalizacaoDoRequerimento(req);
		}

		index();
	}

	public static void alterar(String nome, String siape,String email, String senha, String confirmacao){

		Usuario usuario = Usuario.getUsuarioPorEmail(Security.connected());
		boolean equals =true;
		if(!usuario.email.equals(email))
			equals = false;
	
		
//				renderJSON("teste: " + usuario.id+" "+usuario.email+"\n"+email+"  "+ senha);
			//esta alterando a senha
			if(senha.length() != 0 && confirmacao.length() != 0){			
				usuario.email = email;
				//confere  senha
				if(senha.hashCode() == confirmacao.hashCode()){
					usuario.senhaHash = senha.hashCode();
				}
				usuario.nome = nome;
				usuario.siape = siape;
				//salva
				usuario.save();		
				if(equals)
					index();
				else{
					try {
						Secure.logout();
						Login.index();
					} catch (Throwable e) {
						e.printStackTrace();
					}
				}
			}
			//nao houve alteração da senha
			else{

				usuario.nome = nome;
				usuario.siape = siape;
				usuario.email = email;
				
				//salva
				usuario.save();
				if(equals){
					index();
				}
				else{
					try {
						
						Secure.logout();
						Login.index();
					} catch (Throwable e) {
						e.printStackTrace();
					}
				}
			} 

		}

	public static void alterarColegiado(long id ,String email, String senha, String confirmacao){

		//recupera o aluno
		Usuario usuario = Usuario.findById(id);

		//esta alterando a senha
		if(senha.length() != 0 && confirmacao.length() != 0){			
			usuario.email = email;
			//confere  senha
			if(senha.hashCode() == confirmacao.hashCode()){
				usuario.senhaHash = senha.hashCode();
			}
			//salva
			usuario.validateAndSave();			
			verColegiado();
		}
		//nao houve alteração da senha
		else{
			usuario.email = email;
			//salva
			usuario.validateAndSave();			
			verColegiado();
		} 

	}

	
	
	public static void alteraEmail(String email){
		Usuario user = Usuario.getUsuarioPorEmail(Security.connected());
		//altera o email
		user.email = email;
		//salva no banco
		user.save();
	}
	
	
	
	
	public static boolean alteraSenha(@Valid String senha, @Valid String confirmacao){

		//se as senhas estiverem corretas
		if(senha.hashCode() == confirmacao.hashCode()){ 
			Usuario user = Usuario.getUsuarioPorEmail(Security.connected());
			//altera a senha
			user.senhaHash = senha.hashCode();
			//salva no banco
			user.save();
			verColegiado();
				return true;
		}
		//as senhas estao diferentes
		else {
			verColegiado();
			
			return false;
		}
	}

	
	
	/**
	 * adiciona mais um usuario no sistema
	 * @param usuario usuario que sera adicionado
	 */
	public static void addColegiado(String nome, String siape,String email, String senha){
		Usuario usuario = new Usuario(nome, siape,email, senha);	
		//se os campos obrigatorios nao estiverem preenchidos
		//garante que nao sera um coordenador
		usuario.coordenador = 0;
		try{
			usuario.validateAndSave();
			verColegiado();
		}
		catch (Exception e) {
			verColegiado();
		}

	}
	
	public static void downloadUserPhoto(long id) {
		final Requerimento user = Requerimento.findById(id);
		notFoundIfNull(user);
		response.setContentTypeIfNotSet(user.photo.type());
		renderBinary(user.photo.get(), user.photoFileName);
	}
	
	public static void informaFinalizacaoDoRequerimento(Requerimento req){
		GeradorDeEmails a = new GeradorDeEmails();
		
		GeradorDePDF gerador = new GeradorDePDF();
		
		Usuario usuario = Usuario.getUsuarioCoordenador();
		
		try {
			
			//a.enviaEmail("glauco.sousa6@gmail.com", "HUUUUUUUUUUUUUUUU");

			boolean aa = req.aprovado == 1 ? true:false;
			String endereco = gerador.criarPDF(req,aa);
			
			if(aa){
				a.enviaEmailComAnexo(endereco, "glauco.sousa6@gmail.com", true);		
			}
			else
				a.enviaEmailComAnexo(endereco, "glauco.sousa6@gmail.com", false);		
			
			a.enviaEmail(Usuario.getUsuarioCoordenador().email, "O requerimento " + req.requerimento + " com justificativa " + req.justificativa +" foi encerrado." );
			gerador.deletePDF(endereco);
		    index();
		} catch (Exception e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		
		
		
//		try {
//			
//			gerador.criarPDF(this);
//			a.enviaEmailComAnexo("C:\\Users\\Glauco\\Universidade\\MPS\\Projeto-MPS\\requerimentoaluno\\public\\Requerimento.pdf", "glauco.sousa6@gmail.com", this.aprovado==1?true:false);
//			//a.enviaEmailComAnexo("public\\" + this.aluno+".pdf", usuario.email, this.aprovado==1?true:false);
//			gerador.deletePDF(this);
//		} catch (Exception e) {
//			
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}finally{
//			
//			
//			
//		}

		
		
		
	}
	/**
	 * deleta o usuario especificado do banco
	 * @param usuario quem sera removido
	 */
	public static void removeColegiado(long idUsuario){		
		Usuario usuario = Usuario.findById(idUsuario);
		if(usuario!=null){			
			Voto.deleteVotosDoUsuario(idUsuario);
			usuario.delete();

		}
		verColegiado();
	}

}
